package config

import (
	"fmt"
	"time"

	"github.com/spf13/viper"
)

// =====================================================
// 配置结构体定义
// =====================================================

// Config 全局配置
type Config struct {
	Server    ServerConfig    `mapstructure:"server"`
	Database  DatabaseConfig  `mapstructure:"database"`
	Coze      CozeConfig      `mapstructure:"coze"`
	Fetcher   FetcherConfig   `mapstructure:"fetcher"`
	AI        AIConfig        `mapstructure:"ai"`
	Scheduler SchedulerConfig `mapstructure:"scheduler"`
	Log       LogConfig       `mapstructure:"log"`
	CORS      CORSConfig      `mapstructure:"cors"`
	RSS       RSSConfig       `mapstructure:"rss"`
	Cron      CronConfig      `mapstructure:"cron"`
}

// ServerConfig 服务器配置
type ServerConfig struct {
	Host         string `mapstructure:"host"`
	Port         int    `mapstructure:"port"`
	Mode         string `mapstructure:"mode"`          // debug / release
	ReadTimeout  int    `mapstructure:"read_timeout"`  // 秒
	WriteTimeout int    `mapstructure:"write_timeout"` // 秒
}

// DatabaseConfig 数据库配置
type DatabaseConfig struct {
	Host            string `mapstructure:"host"`
	Port            int    `mapstructure:"port"`
	Username        string `mapstructure:"username"`
	Password        string `mapstructure:"password"`
	Database        string `mapstructure:"database"`
	DBName          string `mapstructure:"dbname"` // 兼容 dbname 字段
	Charset         string `mapstructure:"charset"`
	MaxIdleConns    int    `mapstructure:"max_idle_conns"`
	MaxOpenConns    int    `mapstructure:"max_open_conns"`
	ConnMaxLifetime int    `mapstructure:"conn_max_lifetime"` // 秒
}

// CozeConfig Coze AI 配置
type CozeConfig struct {
	APIKey     string `mapstructure:"api_key"`
	BotID      string `mapstructure:"bot_id"`
	BaseURL    string `mapstructure:"base_url"`
	Endpoint   string `mapstructure:"endpoint"`    // API 端点 URL
	Model      string `mapstructure:"model"`       // 模型名称
	Timeout    int    `mapstructure:"timeout"`     // 秒
	MaxRetries int    `mapstructure:"max_retries"`
}

// FetcherConfig RSS 抓取配置
type FetcherConfig struct {
	DefaultInterval int    `mapstructure:"default_interval"` // 秒
	Timeout         int    `mapstructure:"timeout"`          // 秒
	MaxRetries      int    `mapstructure:"max_retries"`
	UserAgent       string `mapstructure:"user_agent"`
	EnableProxy     bool   `mapstructure:"enable_proxy"`
	ProxyURL        string `mapstructure:"proxy_url"`
}

// AIConfig AI 摘要配置
type AIConfig struct {
	Enabled               bool `mapstructure:"enabled"`
	BatchSize             int  `mapstructure:"batch_size"`
	RetryOnError          bool `mapstructure:"retry_on_error"`
	FallbackToDescription bool `mapstructure:"fallback_to_description"`
	SummaryMaxLength      int  `mapstructure:"summary_max_length"`
	RequestInterval       int  `mapstructure:"request_interval"` // 请求间隔(毫秒),避免API限流
}

// SchedulerConfig 定时任务配置
type SchedulerConfig struct {
	EnableFetch bool   `mapstructure:"enable_fetch"`
	FetchCron   string `mapstructure:"fetch_cron"`
	EnableAI    bool   `mapstructure:"enable_ai"`
	AICron      string `mapstructure:"ai_cron"`
}

// LogConfig 日志配置
type LogConfig struct {
	Level    string `mapstructure:"level"`     // debug / info / warn / error
	Format   string `mapstructure:"format"`    // json / text
	Output   string `mapstructure:"output"`    // stdout / file
	FilePath string `mapstructure:"file_path"`
}

// CORSConfig CORS 跨域配置
type CORSConfig struct {
	AllowOrigins     []string `mapstructure:"allowOrigins"`
	AllowMethods     []string `mapstructure:"allowMethods"`
	AllowHeaders     []string `mapstructure:"allowHeaders"`
	AllowCredentials bool     `mapstructure:"allowCredentials"`
	MaxAge           int      `mapstructure:"maxAge"` // 秒
}

// RSSConfig RSS 抓取配置
type RSSConfig struct {
	DefaultInterval      int    `mapstructure:"defaultInterval"`      // 秒
	Timeout              int    `mapstructure:"timeout"`              // 秒
	UserAgent            string `mapstructure:"userAgent"`
	MaxConcurrency       int    `mapstructure:"maxConcurrency"`
	MaxArticlesPerFeed   int    `mapstructure:"maxArticlesPerFeed"`
}

// CronConfig 定时任务配置
type CronConfig struct {
	FeedFetchCron       string `mapstructure:"feedFetchCron"`
	AISummaryCron       string `mapstructure:"aiSummaryCron"`
	CleanupCron         string `mapstructure:"cleanupCron"`
	ArticleRetentionDays int   `mapstructure:"articleRetentionDays"`
}

// =====================================================
// 全局配置实例
// =====================================================

var GlobalConfig *Config

// =====================================================
// 配置加载函数
// =====================================================

// LoadConfig 加载配置文件
// 参数:
//   - configPath: 配置文件路径,默认为 "config.yaml"
// 返回:
//   - *Config: 配置对象
//   - error: 错误信息
func LoadConfig(configPath string) (*Config, error) {
	// 设置默认配置文件路径
	if configPath == "" {
		configPath = "config.yaml"
	}

	// 初始化 Viper
	v := viper.New()
	v.SetConfigFile(configPath)
	v.SetConfigType("yaml")

	// 读取配置文件
	if err := v.ReadInConfig(); err != nil {
		return nil, fmt.Errorf("读取配置文件失败: %w", err)
	}

	// 解析配置到结构体
	var config Config
	if err := v.Unmarshal(&config); err != nil {
		return nil, fmt.Errorf("解析配置文件失败: %w", err)
	}

	// 验证配置
	if err := validateConfig(&config); err != nil {
		return nil, fmt.Errorf("配置验证失败: %w", err)
	}

	// 保存到全局变量
	GlobalConfig = &config

	return &config, nil
}

// =====================================================
// 配置验证函数
// =====================================================

// validateConfig 验证配置的有效性
func validateConfig(config *Config) error {
	// 验证服务器配置
	if config.Server.Port <= 0 || config.Server.Port > 65535 {
		return fmt.Errorf("无效的服务器端口: %d", config.Server.Port)
	}

	if config.Server.Mode != "debug" && config.Server.Mode != "release" {
		return fmt.Errorf("无效的运行模式: %s (只支持 debug/release)", config.Server.Mode)
	}

	// 验证数据库配置
	if config.Database.Host == "" {
		return fmt.Errorf("数据库主机不能为空")
	}

	if config.Database.Database == "" && config.Database.DBName == "" {
		return fmt.Errorf("数据库名称不能为空")
	}

	// 验证 Coze 配置(如果启用 AI)
	if config.AI.Enabled {
		if config.Coze.APIKey == "" || config.Coze.APIKey == "your_coze_api_key_here" {
			return fmt.Errorf("Coze API Key 未配置")
		}

		if config.Coze.BotID == "" || config.Coze.BotID == "your_bot_id_here" {
			return fmt.Errorf("Coze Bot ID 未配置")
		}
	}

	return nil
}

// =====================================================
// 便捷方法
// =====================================================

// GetDSN 获取数据库连接字符串
// 返回 MySQL DSN 格式: username:password@tcp(host:port)/database?charset=utf8mb4&parseTime=True&loc=Local
func (c *DatabaseConfig) GetDSN() string {
	// 兼容 database 和 dbname 两种配置方式
	dbname := c.Database
	if dbname == "" {
		dbname = c.DBName
	}
	return fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s&parseTime=True&loc=Local",
		c.Username,
		c.Password,
		c.Host,
		c.Port,
		dbname,
		c.Charset,
	)
}

// GetConnMaxLifetime 获取连接最大生存时间(time.Duration)
func (c *DatabaseConfig) GetConnMaxLifetime() time.Duration {
	return time.Duration(c.ConnMaxLifetime) * time.Second
}

// GetServerAddr 获取服务器监听地址
// 返回格式: :8080
func (c *ServerConfig) GetServerAddr() string {
	return fmt.Sprintf(":%d", c.Port)
}

// GetReadTimeout 获取读取超时时间(time.Duration)
func (c *ServerConfig) GetReadTimeout() time.Duration {
	return time.Duration(c.ReadTimeout) * time.Second
}

// GetWriteTimeout 获取写入超时时间(time.Duration)
func (c *ServerConfig) GetWriteTimeout() time.Duration {
	return time.Duration(c.WriteTimeout) * time.Second
}

// GetTimeout 获取 Coze API 超时时间(time.Duration)
func (c *CozeConfig) GetTimeout() time.Duration {
	return time.Duration(c.Timeout) * time.Second
}

// GetTimeout 获取 Fetcher 超时时间(time.Duration)
func (c *FetcherConfig) GetTimeout() time.Duration {
	return time.Duration(c.Timeout) * time.Second
}

// GetDefaultInterval 获取默认抓取间隔(time.Duration)
func (c *FetcherConfig) GetDefaultInterval() time.Duration {
	return time.Duration(c.DefaultInterval) * time.Second
}
